from django.http import HttpResponse
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from .serializers import RegisterSmscodeSerializer
from random import randint
from libs.yuntongxun.sms import CCP

# Create your views here.

class RegisterImageCodeView(APIView):

    """
    前端需要传递给我们一个 uuid
    生成图片资源，记录图片验证码的内容
    图片验证码的内容保存在redis中 （key uuid）
    通过get方式来得到图片资源


    GET     /verifications/imagecodes/uuid/


    GET      /verifications/imagecodes/(?P<image_code_id>.+)/
    """

    def get(self,request,image_code_id):

        #1. 生成图片资源
        text,image = captcha.generate_captcha()
        # 2. 保存到redis中
        redis_conn = get_redis_connection('code')

        # img_ + image_code_id
        redis_conn.setex('img_%s'%image_code_id,60,text)

        # 3.返回响应
        # 图片是二进制
        # content_type 是MIME类型  语法形式为： 大类/小类
        # application/json      text/javascript  text/csss
        # image/jpeg        image/png       image/gif
        # return HttpResponse(image,content_type='application/json')

        return HttpResponse(image,content_type='image/jpeg')


class RegisterSmscodeView(APIView):

    """
    1.当用户点击获取短信验证码的时候，需要将 手机号，图片验证码以及 image_code_id（uuid）传递给后端
    2.接受参数
    3.校验参数
    4.生成短信验证码
    5.保存短信验证码到redis中
    6.发送短信
    7.返回响应

    GET      verifications/smscodes/mobile/text/image_code_id/

    GET      verifications/smscodes/?mobile=xxxx&text=xxxx&image_code_id=xxxx

    GET     verifications/smscodes/(moble)/?text=xxxx&image_code_id=xxxx

    以上三种形式都可以
    我们选择第三种

    """

    def get(self,request,mobile):

        # 1. 接受参数
        query_params = request.query_params

        # 2. 验证
        # text = query_params.get('text')
        # image_code_id = query_params.get('image_code_id')
        #
        # if not all([text,image_code_id]):
        #     pass
        #
        # if text != xxx:
        #     pass

        #2.1创建序列化器
        serializer = RegisterSmscodeSerializer(data=query_params)

        #2.2 进行校验
        serializer.is_valid(raise_exception=True)


        # 3. 生成短信验证码
        sms_code = '%06d'%randint(0,999999)


        # 4. 保存短信验证码到redis中

        redis_conn = get_redis_connection('code')

        from . import constants
        redis_conn.setex('sms_%s'%mobile,constants.SMS_CODE_EXPIRE,sms_code)

        # # 5. 发送短信
        # ccp = CCP()
        # # 注意： 测试的短信模板编号为1
        # ccp.send_template_sms(mobile, [sms_code, 5], 1)


        from celery_tasks.sms.tasks import send_sms_code
        # 注意 千万不要直接调用
        # send_sms_code
        # 需要使用delay  () 的参数 和方法的参数是一致
        send_sms_code.delay(mobile,sms_code)

        # 6.返回响应
        return Response({'msg':'ok'})



